home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 1
/
Nebula One.iso
/
ArchiveUtils
/
Unarj
/
unarj.h
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-08
|
12KB
|
415 lines
/* UNARJ.H, UNARJ, R JUNG, 12/03/91
* Include file
* Copyright (c) 1990 by Robert K Jung. All rights reserved.
*
* This code may be freely used in programs that are NOT ARJ archivers
* (both compress and extract ARJ archives).
*
* If you wish to distribute a modified version of this program, you
* MUST indicate that it is a modified version both in the program and
* source code.
*
* If you modify this program, I would appreciate a copy of the new
* source code. I am holding the copyright on the source code, so
* please do not delete my name from the program files or from the
* documentation.
*
* Modification history:
* Date Programmer Description of modification.
* 04/05/91 R. Jung Rewrote code.
* 04/23/91 M. Adler Portabilized.
* 04/29/91 R. Jung Added volume label support.
* 05/30/91 R. Jung Added SEEK_END definition.
* 06/03/91 R. Jung Changed arguments in get_mode_str() and
* set_ftime_mode().
* 06/28/91 R. Jung Added new HOST OS numbers.
* 07/08/91 R. Jung Added default_case_path() and strlower().
* 07/21/91 R. Jung Fixed #endif _QC comment.
* 08/27/91 R. Jung Added #ifdef for COHERENT.
* 09/01/91 R. Jung Added new host names.
* 12/03/91 R. Jung Added BACKUP_FLAG.
*
*/
#ifndef _ARH_DEF_
#define _ARH_DEF_
/* Use prototypes and ANSI libraries if __STDC__ */
#ifdef __STDC__
# define MODERN
#endif /* __STDC__ */
/* Do not use prototypes for COHERENT */
#ifdef COHERENT
# undef MODERN
# define KEEP_WINDOW
#endif /* COHERENT */
/* Use prototypes and ANSI libraries if __TURBOC__ */
#ifdef __TURBOC__
# define MODERN
#endif /* __TURBOC__ */
/* Use prototypes and ANSI libraries if _QC */
#ifdef _QC
# define MODERN
#endif /* _QC */
/* Use prototypes and ANSI libraries if _OS2 */
#ifdef _OS2
# define MODERN
#endif /* _OS2 */
/* Use prototypes and ANSI libraries if _NeXT */
#ifdef _NeXT
# define MODERN
#endif /* _NeXT */
/* Used to remove arguments in function prototypes for non-ANSI C */
#ifdef MODERN
# define OF(a) a
#else /* !MODERN */
# define OF(a) ()
#endif /* ?MODERN */
#ifdef MODERN
typedef void voidp;
#else /* !MODERN */
# define void int
typedef char voidp;
#endif /* ?MODERN */
#include <stdio.h>
#ifdef MODERN
# include <limits.h>
#else /* !MODERN */
# ifndef UCHAR_MAX
# define UCHAR_MAX (255)
# endif
# ifndef CHAR_BIT
# define CHAR_BIT (8)
# endif
# ifndef LONG_MAX
# define LONG_MAX (0x7FFFFFFFL)
# endif
#endif /* ?MODERN */
#ifndef SEEK_SET
# define SEEK_SET 0
#endif
#ifndef SEEK_CUR
# define SEEK_CUR 1
#endif
#ifndef SEEK_END
# define SEEK_END 2
#endif
typedef unsigned char uchar; /* 8 bits or more */
typedef unsigned int uint; /* 16 - 32 bits or more */
typedef unsigned short ushort; /* 16 bits or more */
typedef unsigned long ulong; /* 32 bits or more */
#define USHRT_BIT (CHAR_BIT * sizeof(ushort))
/* ********************************************************* */
/* Environment definitions (implementation dependent) */
/* ********************************************************* */
#ifdef _QC
#define __MSDOS__
#endif
#ifdef __MSDOS__
#define OS 0
#define PATH_SEPARATORS "\\:"
#define PATH_CHAR '\\'
#define MAXSFX 25000L
#define ARJ_SUFFIX ".ARJ"
#endif
#ifdef _OS2
#define OS 0 /* ??? */
#define PATH_SEPARATORS "\\:"
#define PATH_CHAR '\\'
#define SWITCH_CHARS "-/"
#define MAXSFX 25000L
#define ARJ_SUFFIX ".ARJ"
#endif
#ifdef _NeXT
#define OS 8 /* NeXT */
#define PATH_SEPARATORS "/"
#define PATH_CHAR '/'
#define SWITCH_CHARS "-"
#define FNAME_MAX 1024
#define MAXSFX 500000L
#define ARJ_SUFFIX ".arj"
#endif
#ifdef __CI
#define PRIME 1
#define OS 1
#define PATH_SEPARATORS ">"
#define PATH_CHAR '>'
#define FIX_PARITY(c) c |= ~ASCII_MASK
#define DEFAULT_DIR "*>"
#define ARJ_SUFFIX ".ARJ"
#endif
/* Error levels */
#ifndef ERROR_DEFINES
#define ERROR_OK 0 /* success */
#define ERROR_WARN 1 /* minor problem (file not found) */
#define ERROR_FAIL 2 /* fatal error */
#define ERROR_CRC 3 /* CRC error */
#define ERROR_SECURE 4 /* ARJ security invalid or not found */
#define ERROR_WRITE 5 /* disk full */
#define ERROR_OPEN 6 /* can't open file */
#define ERROR_USER 7 /* user specified bad parameters */
#define ERROR_MEMORY 8 /* not enough memory */
#endif
#ifndef MAXSFX /* size of self-extracting prefix */
#define MAXSFX 500000L
#endif
#ifndef FNAME_MAX
#define FNAME_MAX 512
#endif
#ifndef SWITCH_CHARS
#define SWITCH_CHARS "-"
#endif
#ifndef FIX_PARITY
#define FIX_PARITY(c) c &= ASCII_MASK
#endif
#ifndef ARJ_SUFFIX
#define ARJ_SUFFIX ".arj"
#endif
#ifndef ARJ_DOT
#define ARJ_DOT '.'
#endif
#ifndef DEFAULT_DIR
#define DEFAULT_DIR ""
#endif
#ifndef OS
#define OS 2
#endif
#ifndef PATH_SEPARATORS
#define PATH_SEPARATORS "/"
#endif
#ifndef PATH_CHAR
#define PATH_CHAR '/'
#endif
/* ********************************************************* */
/* end of environmental defines */
/* ********************************************************* */
/* ********************************************************* */
/*
* Structure of archive block (low order byte first):
*
* 2 header id (comment and local file) = 0xEA60 or 60000U
* 2 basic header size (from 'first_hdr_size' thru 'comment' below)
* = first_hdr_size + strlen(filename) + 1 + strlen(comment) + 1
* = 0 if end of archive
*
* 1 first_hdr_size (size up to 'extra data')
* 1 archiver version number
* 1 minimum archiver version to extract
* 1 host OS (0 = MSDOS, 1 = PRIMOS, 2 = UNIX, 3 = AMIGA, 4 = MAC-OS)
* (5 = OS/2, 6 = APPLE GS, 7 = ATARI ST, 8 = NEXT)
* (9 = VAX VMS)
* 1 arj flags (0x01 = GARBLED_FLAG, 0x02 = RESERVED)
* (0x04 = VOLUME_FLAG, 0x08 = EXTFILE_FLAG)
* (0x10 = PATHSYM_FLAG, 0x20 = BACKUP_FLAG)
* 1 method (0 = stored, 1 = compressed most ... 4 compressed fastest)
* 1 file type (0 = binary, 1 = text, 2 = comment header)
* (3 = directory, 4 = volume label)
* 1 reserved
* 4 date time stamp modified
* 4 compressed size
* 4 original size
* 4 original file's CRC
* 2 entryname position in filename
* 2 file access mode
* 2 host data
* ? extra data
* 4 bytes for extended file position
*
* ? filename (null-terminated)
* ? comment (null-terminated)
*
* 4 basic header CRC
*
* 2 1st extended header size (0 if none)
* ? 1st extended header
* 4 1st extended header's CRC (not present if 0 extended header size)
* ...
* ? compressed file
*
* ********************************************************* */
/* ********************************************************* */
/* */
/* Time stamp format: */
/* */
/* 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 */
/* |<---- year-1980 --->|<- month ->|<--- day ---->| */
/* */
/* 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 */
/* |<--- hour --->|<---- minute --->|<- second/2 ->| */
/* */
/* ********************************************************* */
#define CODE_BIT 16
#define NULL_CHAR '\0'
#define MAXMETHOD 4
#define ARJ_VERSION 3
#define ARJ_X_VERSION 3 /* decoder version */
#define ARJ_X1_VERSION 1
#define DEFAULT_METHOD 1
#define DEFAULT_TYPE 0 /* if type_sw is selected */
#define HEADER_ID 0xEA60
#define HEADER_ID_HI 0xEA
#define HEADER_ID_LO 0x60
#define FIRST_HDR_SIZE 30
#define FIRST_HDR_SIZE_V 34
#define COMMENT_MAX 2048
#define HEADERSIZE_MAX (FIRST_HDR_SIZE + 10 + FNAME_MAX + COMMENT_MAX)
#define BINARY_TYPE 0 /* This must line up with binary/text strings */
#define TEXT_TYPE 1
#define COMMENT_TYPE 2
#define DIR_TYPE 3
#define LABEL_TYPE 4
#define GARBLE_FLAG 0x01
#define VOLUME_FLAG 0x04
#define EXTFILE_FLAG 0x08
#define PATHSYM_FLAG 0x10
#define BACKUP_FLAG 0x20
typedef ulong UCRC; /* CRC-32 */
#define CRC_MASK 0xFFFFFFFFL
#define ARJ_PATH_CHAR '/'
#define FA_RDONLY 0x01 /* Read only attribute */
#define FA_HIDDEN 0x02 /* Hidden file */
#define FA_SYSTEM 0x04 /* System file */
#define FA_LABEL 0x08 /* Volume label */
#define FA_DIREC 0x10 /* Directory */
#define FA_ARCH 0x20 /* Archive */
#define HOST_OS_NAMES1 "MS-DOS","PRIMOS","UNIX","AMIGA","MAC-OS","OS/2"
#define HOST_OS_NAMES2 "APPLE GS","ATARI ST","NEXT","VAX VMS"
#define HOST_OS_NAMES { HOST_OS_NAMES1, HOST_OS_NAMES2, NULL }
/* Timestamp macros */
#define get_tx(m,d,h,n) (((ulong)m<<21)+((ulong)d<<16)+((ulong)h<<11)+(n<<5))
#define get_tstamp(y,m,d,h,n,s) ((((ulong)(y-1980))<<25)+get_tx(m,d,h,n)+(s/2))
#define ts_year(ts) ((uint)((ts >> 25) & 0x7f) + 1980)
#define ts_month(ts) ((uint)(ts >> 21) & 0x0f) /* 1..12 means Jan..Dec */
#define ts_day(ts) ((uint)(ts >> 16) & 0x1f) /* 1..31 means 1st..31st */
#define ts_hour(ts) ((uint)(ts >> 11) & 0x1f)
#define ts_min(ts) ((uint)(ts >> 5) & 0x3f)
#define ts_sec(ts) ((uint)((ts & 0x1f) * 2))
/* unarj.c */
extern long origsize;
extern long compsize;
extern UCRC crc;
extern FILE *arcfile;
extern FILE *outfile;
extern ushort bitbuf;
extern uchar subbitbuf;
extern uchar header[HEADERSIZE_MAX];
extern char arc_name[FNAME_MAX];
extern int bitcount;
extern int file_type;
extern int error_count;
/* Global functions */
/* unarj.c */
void strlower OF((char *str));
void strupper OF((char *str));
voidp *malloc_msg OF((int size));
void disp_clock OF((void));
void error OF((char *fmt, char *arg));
void fillbuf OF((int n));
ushort getbits OF((int n));
void fwrite_txt_crc OF((uchar *p, int n));
void init_getbits OF((void));
/* environ.c */
FILE *file_open OF((char *name, char *mode));
int file_read OF((char *buf, int size, int nitems, FILE *stream));
int file_seek OF((FILE *stream, long offset, int mode));
long file_tell OF((FILE *stream));
int file_write OF((char *buf, int size, int nitems, FILE *stream));
voidp *xmalloc OF((int size));
void case_path OF((char *name));
void default_case_path OF((char *name));
int file_exists OF((char *name));
void get_mode_str OF((char *str, uint fmode));
int set_ftime_mode OF((char *name, ulong timestamp, uint fmode, uint host));
/* decode.c */
void decode OF((void));
void decode_f OF((void));
/* Message strings */
extern char M_VERSION [];
extern char M_ARCDATE [];
extern char M_BADCOMND[];
extern char M_BADCOMNT[];
extern char M_BADHEADR[];
extern char M_BADTABLE[];
extern char M_CANTOPEN[];
extern char M_CANTREAD[];
extern char M_CANTWRIT[];
extern char M_CRCERROR[];
extern char M_CRCOK [];
extern char M_DIFFHOST[];
extern char M_ENCRYPT [];
extern char M_ERRORCNT[];
extern char M_EXTRACT [];
extern char M_FEXISTS [];
extern char M_HEADRCRC[];
extern char M_NBRFILES[];
extern char M_NOMEMORY[];
extern char M_NOTARJ [];
extern char M_PROCARC [];
extern char M_SKIPPED [];
extern char M_SUFFIX [];
extern char M_TESTING [];
extern char M_UNKNMETH[];
extern char M_UNKNTYPE[];
extern char M_UNKNVERS[];
#endif
/* end UNARJ.H */